// 原型链
// 对象使用大括号赋值会指向新的地址，原来的对象会被废弃

// function A(){}
// A.prototype.n = 1
// let b = new A() 
// // A.prototype = {
// //   n:2,
// //   m:3
// // }
// A.prototype.n = 2
// A.prototype.m = 3
// let c = new A()
// console.log(b.n,b.m,c.n,c.m)

// ----------------------------------

// let F = function(){}
// Object.prototype.a = function(){
//   console.log('a()')
// }
// Function.prototype.b = function(){
//   console.log('b()')
// }
// let f = new F()
// f.a()
// console.log(f.b)
// F.a()
// F.b()

// --------------------------------------
// 执行上下文
// 5个执行上下文栈

// console.log('gobal begin:' + i)
// var i = 1
// foo(1)
// function foo(i){
//   if(i == 4){
//     return;
//   }
//   console.log('foo() begin:' + i)
//   foo(i + 1)
//   console.log('foo() end:' + i)
// }
// console.log('gobal end:' + i)

// ---------------------------------------------
// 先执行变量提升，再执行函数提升 使用let不允许出现同名变量

// function a() {}
// var a;
// console.log(typeof a)

// ---------------------------------------------

// if(!(b in global)){
//   var b = 1
// }
// console.log(b)

// ----------------------------------------------
// 先执行变量提升，再执行函数提升，再执行变量赋值

// var c = 1
// function c(c){
//   console.log(c)
//   var c = 3
// }
// c(2)

//------------------------------------------------
// 闭包

// let name = 'The window'
// let obj = {
//   name:'The obj',
//   getName:function(){
//     _this = this
//     return function(){
//       return _this.name
//     }
//   }
// }
// console.log(obj.getName()())

// --------------------------------------------------

// function fun(n,o){
//   console.log(o)
//   return {
//     refun : function(m){
//       return fun(m,n)
//     }
//   }
// }
// let a = fun(0); a.refun(1); a.refun(2); a.refun(3); //undefined 0 0 0
// let b = fun(0).refun(1).refun(2).refun(3); //undefined 0 1 2
// let c = fun(0).refun(1); c.refun(2); c.refun(3); //undefined 0 1 1

// ----------------------------------------------------------

